﻿---------------------------------------------------------------------------------------
------------------------Funciones para copiar Guias Remision---------------------------
---------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pca_guias.fn_copiar_guia_remision_remitente(bigint,--guia_remision_remitente_id $1
								       varchar,--el tipo de documento de destino $2
								       bigint --sesion_id $3
								       )RETURNS bigint AS
$$
DECLARE
	_row pca_guias.vw_guias_remision_remitente%ROWTYPE;
	_id_result bigint;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_guias.vw_guias_remision_remitente
	WHERE
		guia_remision_remitente_id = $1;
		
	IF(FOUND)THEN
		IF($2='01' OR $2='03')THEN --Si son factura o boleta
			_id_result := pca_ventas.fn_add_comprobante($3,--sesion_id
								    _row.oficina_id,--oficina_id
								    _row.empresa_id,--empresa_id
								    $2,--documento_id
								    0,--serie
								    0,--numero
								    null,--cliente_id
								    _row.num_doc_identidad_destinatario,--num_doc_identidad
								    _row.nombre_destinatario,--nombre_cliente
								    _row.punto_llegada,--direccion_cliente
								    '01',--plazo_id
								    _row.fecha_traslado,--fecha_hora_emision
							            _row.fecha_traslado,--fecha_hora_vencimiento
								    _row.precios_incluyen_igv,--precios_incluyen_igv
								    _row.val_igv,--val_igv
								    _row.moneda_id,--moneda_id
								    _row.importe_bruto,--importe_bruto
								    _row.descuento,--descuento
								    _row.valor_venta,--valor_venta
								    _row.impuesto,--impuesto
								    _row.precio_venta,--precio_venta
								    0,--total_pagos
								    '00',--estado_comprobante_id
								    _row.tipo_cambio_emision,--tipo_cambio_emision
								    _row.strserienumero,--adicional1(N° guia Remision)
								    NULL,--adicional2
								    NULL,--adicional3
								    NULL --adicional4
								    );

			--Copiar todos los detalles
			INSERT INTO pca_ventas.detalles_comprobante
				(sesion_id,
				 comprobante_id,
				 correlativo,
				 articulo_id,
				 codigo,
				 cantidad,
				 medida,
				 descripcion,
				 precio_unitario,
				 precio_costo,
				 precio_total)
			SELECT
				$3,
				_id_result,
				correlativo,
				articulo_id,
				codigo,
				cantidad,
				medida,
				descripcion,
				precio_unitario,
				precio_costo,
				precio_total
			FROM
				pca_guias.detalles_guias_remision_remitente
			WHERE
				guia_remision_remitente_id = $1;

			RETURN _id_result;
							
		ELSIF($2='09')THEN--si es guia remision remitente
			_id_result := pca_guias.fn_add_guia_remision_remitente($3,--sesion_id
									       _row.oficina_id,--oficina_id
									       _row.empresa_id,--empresa_id
									       0,--serie
									       0,--numero
									       _row.comprobante_id,--comprobante_id
									       _row.fecha_traslado,--fecha_traslado
									       _row.num_doc_identidad_destinatario,--num_doc_identidad_destinatario
									       _row.nombre_destinatario,--nombre_destinatario
									       _row.punto_partida,--punto_partida
									       _row.punto_llegada,--punto_llegada
									       _row.motivo_traslado,--motivo_traslado
									       _row.num_doc_identidad_transportista,--num_doc_identidad_transportista
									       _row.nombre_transportista,--nombre_transportista
									       _row.marca_placa,--marca_placa
									       _row.licencia_conducir,--licencia_conducir
									       '00',--estado_guia_id
									       _row.precios_incluyen_igv,--precios_incluyen_igv
									       _row.val_igv,--val_igv
									       _row.moneda_id,--moneda_id
									       _row.importe_bruto,--importe_bruto
									       _row.descuento,--descuento
									       _row.valor_venta,--valor_venta
									       _row.impuesto,--impuesto
									       _row.precio_venta,--precio_venta
									       _row.tipo_cambio_emision,--tipo_cambio_emision
									       _row.observaciones,--observaciones
									       _row.imprimir_precios --imprimir_precios
									       );
									       		
			INSERT INTO pca_guias.detalles_guias_remision_remitente
				(sesion_id,
				guia_remision_remitente_id,
				correlativo,
				articulo_id,
				codigo,
				cantidad,
				medida,
				peso,
				descripcion,
				precio_unitario,
				precio_costo,
				precio_total)
			SELECT
				$3,
				_id_result,
				correlativo,
				articulo_id,
				codigo,
				cantidad,
				medida,
				peso,
				descripcion,
				precio_unitario,
				precio_costo,
				precio_total
			FROM
				pca_guias.detalles_guias_remision_remitente
			WHERE
				guia_remision_remitente_id = $1;

			RETURN _id_result;
		ELSE--Generar exception 
			RAISE EXCEPTION 'No existe instrucciones para copiar Guia Remision Remitente con documentoDestinoId = %',$2;
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe Guia Remision Remitente con Id = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;

---------------------------------------------------------------------------------------
--------------------Funciones para copiar comprobante(boleta-factura)------------------
---------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_ventas.fn_copiar_comprobante(bigint,--comprobante_id $1
							    varchar,--el tipo de documento de destino $2
							    bigint --sesion_id $3
							    )RETURNS bigint AS
$$
DECLARE
	_row pca_ventas.vw_comprobantes%ROWTYPE;
	_imprimir_precios pca_guias.guias_remision_remitente.imprimir_precios%TYPE;
	_id_result bigint;
BEGIN
	SELECT
		*
	INTO
		_row
	FROM
		pca_ventas.vw_comprobantes
	WHERE
		comprobante_id = $1;

	IF(FOUND)THEN
		IF($2='01' OR $2='03')THEN --Si son factura o boleta
			_id_result := pca_ventas.fn_add_comprobante($3,--sesion_id
								    _row.oficina_id,--oficina_id
								    _row.empresa_id,--empresa_id
								    $2,--documento_id
								    0,--serie
								    0,--numero
								    _row.cliente_id,--cliente_id
								    _row.num_doc_identidad,--num_doc_identidad
								    _row.nombre_cliente,--nombre_cliente
								    _row.direccion_cliente,--direccion_cliente
								    _row.plazo_id,--plazo_id
								    _row.fecha_hora_emision,--fecha_hora_emision
							            _row.fecha_hora_vencimiento,--fecha_hora_vencimiento
								    _row.precios_incluyen_igv,--precios_incluyen_igv
								    _row.val_igv,--val_igv
								    _row.moneda_id,--moneda_id
								    _row.importe_bruto,--importe_bruto
								    _row.descuento,--descuento
								    _row.valor_venta,--valor_venta
								    _row.impuesto,--impuesto
								    _row.precio_venta,--precio_venta
								    0,--total_pagos
								    '00',--estado_comprobante_id
								    _row.tipo_cambio_emision,--tipo_cambio_emision
								    _row.adicional1,--adicional1
								    _row.adicional2,--adicional2
								    _row.adicional3,--adicional3
								    _row.adicional4 --adicional4
								    );

			--Copiar todos los detalles
			INSERT INTO pca_ventas.detalles_comprobante
				(sesion_id,
				 comprobante_id,
				 correlativo,
				 articulo_id,
				 codigo,
				 cantidad,
				 medida,
				 descripcion,
				 precio_unitario,
				 precio_costo,
				 precio_total)
			SELECT
				$3,
				_id_result,
				correlativo,
				articulo_id,
				codigo,
				cantidad,
				medida,
				descripcion,
				precio_unitario,
				precio_costo,
				precio_total
			FROM
				pca_ventas.detalles_comprobante
			WHERE
				comprobante_id = $1;

			RETURN _id_result;
		
		ELSIF($2='09')THEN--si es guia remision remitente
			_imprimir_precios := pca.fn_get_imprimir_precios_guia_remision_remitente(_row.oficina_id,_row.empresa_id);
			_id_result := pca_guias.fn_add_guia_remision_remitente($3,--sesion_id
									       _row.oficina_id,--oficina_id
									       _row.empresa_id,--empresa_id
									       0,--serie
									       0,--numero
									       null,--comprobante_id
									       _row.fecha_hora_emision,--fecha_traslado
									       _row.num_doc_identidad,--num_doc_identidad_destinatario
									       _row.nombre_cliente,--nombre_destinatario
									       '',--punto_partida
									       _row.direccion_cliente,--punto_llegada
									       '',--motivo_traslado
									       '',--num_doc_identidad_transportista
									       '',--nombre_transportista
									       '',--marca_placa
									       '',--licencia_conducir
									       '00',--estado_guia_id
									       _row.precios_incluyen_igv,--precios_incluyen_igv
									       _row.val_igv,--val_igv
									       _row.moneda_id,--moneda_id
									       _row.importe_bruto,--importe_bruto
									       _row.descuento,--descuento
									       _row.valor_venta,--valor_venta
									       _row.impuesto,--impuesto
									       _row.precio_venta,--precio_venta
									       _row.tipo_cambio_emision,--tipo_cambio_emision
									       '',--observaciones
									       _imprimir_precios --imprimir_precios
									       );
									       		
			INSERT INTO pca_guias.detalles_guias_remision_remitente
				(sesion_id,
				guia_remision_remitente_id,
				correlativo,
				articulo_id,
				codigo,
				cantidad,
				medida,
				descripcion,
				precio_unitario,
				precio_costo,
				precio_total)
			SELECT
				$3,
				_id_result,
				correlativo,
				articulo_id,
				codigo,
				cantidad,
				medida,
				descripcion,
				precio_unitario,
				precio_costo,
				precio_total
			FROM
				pca_ventas.detalles_comprobante
			WHERE
				comprobante_id = $1;

			RETURN _id_result;
		ELSE--Generar exception 
			RAISE EXCEPTION 'No existe instrucciones para copiar comprobante con documentoDestinoId = %',$2;
		END IF;
	ELSE
		RAISE EXCEPTION 'No existe comprobante con Id = %',$1;
	END IF;
END;
$$
LANGUAGE plpgsql;